Скатков Александр
Семантика перемещения
(Move semantics)
Выражения (expressions)
Выражения (expressions)
Что это?
Выражения (expressions)
Что это?
Вычисление выражений (expression evaluation)
Выражения (expressions)
Что это?
Вычисление выражений (expression evaluation)
Тип выражения (expression type)
Выражения (expressions)
Что это?
Вычисление выражений (expression evaluation)
Тип выражения (expression type)
Категория значения (value category)
Категории значений (value
categories)
int main() {
5=4;
}
Категории значений (value
categories)
int main() {
5=4;
}
/*
* lvalue required as left operand of
* assignment
*/
Категории значений (value
categories)
void foo(int& ref){}
int main() {
foo(5);
}
Категории значений (value
categories)
void foo(int& ref){}
int main() {
foo(5); //??
}
Категории значений (value
categories)
void foo(int& ref){}
int main() {
foo(5);
}
/*
* cannot bind non-const lvalue reference
* of type ‘int&’ to an rvalue of type ‘int‘
*/
Категории значений (value
categories)
void foo(int& ref){}
int main() {
foo(5);
}
/*
* cannot bind non-const lvalue reference
* of type ‘int&’ to an rvalue of type ‘int‘
*/
Категории значений (value
categories)
До c++11:
lvalue
rvalue
Категории значений (value
categories)
int main() {
int a;
a = 5;
/*
* rvalue (right-hand side)
* lvalue (left-hand side)
*/
}
Категории значений (value
categories)
Обычно у lvalue:
- Можно взять адрес
- Есть идентификатор
Категории значений (value
categories)
Обычно у lvalue:
- Можно взять адрес
- Есть идентификатор
У rvalue – наоборот:
- Нельзя взять адрес
- Нет идентификатора
Категории значений (value
categories)
Int return_5(){
return 5;
}
int& return_new_5(){
return *(new int{5});
}
int main(){
return_5();
return_new_5();
}
Категории значений (value
categories)
Int return_5(){
return 5;
}
int& return_new_5(){
return *(new int{5});
}
int main(){
return_5(); //rvalue
return_new_5(); //lvalue
}
Категории значений (value
categories)
int& myfoo(){
int a=5;
return a;
}
int main(){
myfoo();
}
Категории значений (value
categories)
int& myfoo(){
int a=5;
return a;
}
int main(){
std::cout<<myfoo();
}
Категории значений (value
categories)
int& myfoo(){
int a=5;
return a;
}
int main(){
std::cout<<myfoo();
}
/* Компилируется, но есть один нюанс!
* Process finished with exit code 139
*/(interrupted by signal 11: SIGSEGV)
Cсылки
Cсылки
Синтаксис:
Type& = exp;
Cсылки
Синтаксис:
Type& = exp;
Expression, что-то знакомое!
Cсылки
Синтаксис:
Type& = exp;
Expression, что-то знакомое!
Ссылки могут быть инициализированы только
lvalue выражениями, за одним исключением.
Cсылки
const Type& = exression;
expession – rvalue или lvalue выражение.
Cсылки
const Type& = exression;
expession – rvalue или lvalue выражение.
Обычная ссылка это lvalue ссылка (lvalue reference)
Cсылки
lvalue ссылки
const Type& = exression;
expession – rvalue или lvalue выражение.
Обычная ссылка это lvalue ссылка (lvalue reference)
lvalue ссылки
const Type& = exression;
expession – rvalue или lvalue выражение.
Обычная ссылка это lvalue ссылка (lvalue reference)
lvalue ссылки
Несколько примеров:
int main() {
int a = 5;
int& ref1 = a;
const int& ref3 = 5;
int& ref4 =a/2;
const int& ref5 = a;
int& ref5 = 5;
}
lvalue ссылки
Несколько примеров:
int main() {
int a = 5;
int& ref1 = a;
const int& ref3 = 5;
int& ref4 =a/2; binding non-const lvalue reference to rvalue
const int& ref5 = a;
int& ref5 = 5; binding non-const lvalue reference to rvalue
}
lvalue ссылки
void foo(int& ref){}
int main() {
foo(5);
}
/*
* cannot bind non-const lvalue reference
* of type ‘int&’ to an rvalue of type ‘int‘
*/
lvalue ссылки
void foo(int& ref){}
int main() {
foo(5);
}
/*
* cannot bind non-const lvalue reference
* of type ‘int&’ to an rvalue of type ‘int‘
*/
lvalue ссылки
void foo(int& ref){}
int main() {
foo(5);
}
/*
* cannot bind non-const lvalue reference
* of type ‘int&’ to an rvalue of type ‘int‘
*/
lvalue ссылки
void foo(const int& ref){}
int main() {
foo(5);
}
lvalue ссылки
void foo(int& ref){}
int main() {
int var = 5;
foo(var);
}
Главные моменты:
Главные моменты:
У выражений есть тип.
Главные моменты:
У выражений есть тип.
Результатом вычисления выражения является значение.
Главные моменты:
У выражений есть тип.
Результатом вычисления выражения является значение.
У значения есть категория
Главные моменты:
У выражений есть тип.
Результатом вычисления выражения является значение.
У значения есть категория
Есть rvalue и lvalue категории
Главные моменты:
У выражений есть тип.
Результатом вычисления выражения является значение.
У значения есть категория
Есть rvalue и lvalue категории
Есть тип: lvalue-ссылка на значение
Главные моменты:
У выражений есть тип.
Результатом вычисления выражения является значение.
У значения есть категория
Есть rvalue и lvalue категории
Есть тип: lvalue-ссылка на значение
Тип выражения определяет тип, на который ссылается ссылка
на вычисленное значение этого выражения.
Категории значений (value
categories)
Начиная с стандарта c++11:
Категории значений (value
categories)
Начиная с стандарта c++11:
- новый тип: rvalue reference
Категории значений (value
categories)
Начиная с стандарта c++11:
- новый тип: rvalue reference
- более богатая классификация категорий значений
Rvalue reference
Синтаксис:
T&& reference_name = expression;
Rvalue reference
Синтаксис:
T&& reference_name = expression;
value category only rvalue.
Rvalue reference
Примеры:
Rvalue reference
Примеры:
int var = 10;
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var;
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var; //lvalue
Rvalue reference
Синтаксис:
T&& reference_name = expression;
expression value category only rvalue.
Rvalue reference
Синтаксис:
T&& reference_name = expression;
expression value category only rvalue.
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var;
/* Rvalue reference to type 'int' cannot bind to
* lvalue of type 'int'
*/
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var;
/* Rvalue reference to type 'int' cannot bind to
* lvalue of type 'int'
*/
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var;
/* Rvalue reference to type 'int' cannot bind to
* lvalue of type 'int'
*/
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var; //bad bind
int&& ref5 = var / 2;
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var; //bad bind
int&& ref5 = (var / 2);
Rvalue reference
Примеры:
int var = 10;
int&& ref1 = 5;
int&& ref2 = 10 / 2;
int&& ref3 = +10;
int&& ref4 = var; //bad bind
int&& ref5 = (var / 2); //rvalue
C++11 value categories
value
Category
C++11 value categories
categorycategory
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int& foo(){
...
}
foo()
-
lvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int& foo(){
...
}
foo()
-
lvalue
(foo())+(5)
lvalu
e
не lvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int& foo(){
...
}
foo()
-
lvalue
((foo())+(5))
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int& foo(){
...
}
foo()
-
lvalue
((foo())+(5))
struct integer{
int value;
};
*Как будто*
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int& foo(){
...
}
foo()
-
lvalue
((foo())+(5))
struct integer{
int value;
friend integer operator+(const integer& lhv, const integer& rhv){
return integer{lhv.value+rhv.value};
}
};
*Как будто*
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int& foo(){
...
}
foo()
-
lvalue
((foo())+(5))
struct integer{
int value;
friend integer operator+(const integer& lhv, const integer& rhv){
return integer{lhv.value+rhv.value};
}
};
*Как будто*
- не lvalue по определению
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int& foo(){
...
}
foo()
-
lvalue
((foo())+(5))
struct integer{
int value;
friend integer operator+(const integer& lhv, const integer& rhv){
return integer{lhv.value+rhv.value};
}
};
*Как будто*
- не lvalue по определению
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int i;
bool b;
double d;
double& lref_d = d;
double&& rref_pi = 3.4;
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int i;
bool b;
double d;
double& lref_d = d;
double&& rref_pi = 3.4;
i
b
d
lref_d
rref_pi
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
lvalu
e
Функция, которая возвращает lvalue
ссылку
Идентификатор объекта.
int i;
bool b;
double d;
double& lref_d = d;
double&& rref_pi = 3.4;
i
b
d
lref_d
rref_pi
все это
lvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
Вызов функции, которая возвращает rvalue ссылку
Несколько других выражений, в которых учатсвуют rvalue ссылки
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
Вызов функции, которая возвращает rvalue ссылку
Несколько других выражений
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
Вызов функции, которая возвращает rvalue ссылку
Несколько других выражений
test&& ref(){
...
}
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
Вызов функции, которая возвращает rvalue ссылку
Несколько других выражений
test&& ref(){
...
}
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
Вызов функции, которая возвращает rvalue ссылку
Несколько других выражений
struct S{
int field;
};
int main(){
S object{};
object.field;
}
Например
:
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
Вызов функции, которая возвращает rvalue ссылку
Несколько других выражений
struct S{
int field;
};
int main(){
S object{};
object.field;
}
Например
:
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
xvalue
“eXpiring value”
Expiring – истекающий, умирающий, в общем вот-вот
закончит свое существование.
Вызов функции, которая возвращает rvalue ссылку
Несколько других выражений
struct S{
int field;
};
int main(){
S object{};
object.field;
}
Например
:
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
glvalue
generalized
lvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
glvalue
generalized
lvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
glvalue
generalized
lvalue
generalized – обобщенная (категория)
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
glvalue
generalized
lvalue
generalized – обобщенная (категория)
glvalue – значит либо lvalue, либо xvalue =)
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
int var{5};
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
int var{5};
void
expression
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
int var{5};
prvalue
void
expression
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
int var{5};
var/2;
prvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
int var{5};
var/2;
-var;
prvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
int var{5};
var/2;
-var;
var+4;
prvalue
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
int var{5};
var/2;
-var;
var+4;
prvalue
int foo(){ return 5; }
void bar(){}
int main(){
foo();
foo()+foo();
bar();
foo()/2;
-foo();
}
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
prvalue
int foo(){ return 5; }
void bar(){}
int main(){
foo();
foo()+foo();
bar();
foo()/2;
-foo();
}
int var{5};
var/2;
-var;
var+4;
1123/2;
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
prvalue
(pure
rvalue)
pure – чистый
Все то, что мы считали rvalue во времена C++03
prvalue
int foo(){ return 5; }
void bar(){}
int main(){
foo();
foo()+foo();
bar();
foo()/2;
-foo();
}
int var{5};
var/2;
-var;
var+4;
1123/2;
C++11 value categories
lvalue
prvalue
xvalue
category
glvalue
rvalue
category
rvalue
rvalue – значит либо xvalue, либо prvalue
C++11 value categories
Ссылки
C++11 value categories
Ссылки
Как мы думали раньше:
type& name= expr; // lvalue
const type& name = expr; // lvalue/rvalue
Type&& name = expr; //rvalue
C++11 value categories
Ссылки
Как мы думали раньше:
type& name= expr; // lvalue
const type& name = expr; // lvalue/rvalue
Type&& name = expr; //rvalue
Сейчас:
type& name= expr;
const type& name = expr; // glvalue/rvalue
type&& name = expr; //rvalue
C++11 value categories
Ссылки
Как мы думали раньше:
type& name= expr; // lvalue
const type& name = expr; // lvalue/rvalue
Type&& name = expr; //rvalue
Сейчас:
type& name= expr;
const type& name = expr; // glvalue/rvalue
type&& name = expr; //rvalue
имеет категорию lvalue
C++11 value categories
Ссылки
Как мы думали раньше:
type& name= expr; // lvalue
const type& name = expr; // lvalue/rvalue
Type&& name = expr; //rvalue
Сейчас:
type& name= expr;
const type& name = expr; // glvalue/rvalue
type&& name = expr; //rvalue
имеет тип rvalue reference
имеет категорию lvalue
C++11 value categories
Ссылки
Как мы думали раньше:
type& name= expr; // lvalue
const type& name = expr; // lvalue/rvalue
Type&& name = expr; //rvalue
Сейчас:
type& name= expr;
const type& name = expr; // glvalue/rvalue
type&& name = expr; //rvalue
является вызовом функции, возвращающей
rvalue reference
имеет тип rvalue reference
имеет категорию lvalue
C++11 value categories
Ссылки
Как мы думали раньше:
type& name= expr; // lvalue
const type& name = expr; // lvalue/rvalue
Type&& name = expr; //rvalue
Сейчас:
type& name= expr;
const type& name = expr; // glvalue/rvalue
type&& name = expr; //rvalue
является вызовом функции, возвращающей
rvalue reference
имеет тип rvalue reference
обращение к полю класса [ object.field например ]
имеет категорию lvalue
C++11 value categories
Ссылки
Как мы думали раньше:
type& name= expr; // lvalue
const type& name = expr; // lvalue/rvalue
Type&& name = expr; //rvalue
Сейчас:
type& name= expr;
const type& name = expr; // glvalue/rvalue
type&& name = expr; //rvalue
является вызовом функции, возвращающей
rvalue reference
имеет тип rvalue reference
обращение к полю класса [ object.field например ]
имеет категорию lvalue
cast to rvalue reference
C++11 value categories
struct test{
test(){
cout<<"Constructor";
}
test(const test& other){
cout<<"Copy constructor";
}
~test(){
cout<<"Destructor";
}
test& operator=(const test& other){
cout<<"Assignment";
return *this;
}
};
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
}
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
}
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
}
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
}
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
static_cast<double>(obj);
}
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
static_cast<double>(obj);
}
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
}
C-style:
(type)exp
r
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
}
C-style:
(type)exp
r
Constructor
Copy constructor
Destructor
Destructor
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
}
C-style:
(type)exp
r
Constructor
Copy constructor
Destructor
Destructor
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
}
C-style:
(type)exp
r
Constructor
Copy constructor
Destructor
Destructor
C++11 value categories
С стандарта
С++11:
static_cast
Полезно посмотреть:
const_cast
reinterpret_cas
t
dynamic_cast
Синтаксис:
static_cast<type>(expr)
Примеры
:
int main(){
static_cast<double>(2+3);
static_cast<int>(true);
test obj;
test& lref = obj;
static_cast<test>(lref);
}
C-style:
(type)exp
r
Constructor
Copy constructor
Destructor
Destructor
C++11 value categories
Cast to rvalue reference
int main(){
test
obj;
}
C++11 value categories
Cast to rvalue reference
int main(){
test obj;
static_cast<test&&>(obj);
}
C++11 value categories
Cast to rvalue reference
int main(){
test obj;
static_cast<test&&>(obj);
test& lref = obj;
}
C++11 value categories
Cast to rvalue reference
int main(){
test obj;
static_cast<test&&>(obj);
test& lref = obj;
static_cast<test&&>(obj);
}
C++11 value categories
Cast to rvalue reference
int main(){
test obj;
static_cast<test&&>(obj);
test& lref = obj;
static_cast<test&&>(obj);
test&& rref =static_cast<test&&>(obj);
}
C++11 value categories
Cast to rvalue reference
int main(){
test obj;
static_cast<test&&>(obj);
test& lref = obj;
static_cast<test&&>(obj);
test&& rref =static_cast<test&&>(obj);
}
Constructo
r
Destructor
C++11 value categories
Cast to rvalue reference
int main(){
test obj;
static_cast<test&&>(obj);
test& lref = obj;
static_cast<test&&>(obj);
test&& rref =static_cast<test&&>(obj);
}
Constructo
r
Destructor
C++11 value categories
lvalue reference rvalue reference
Object Same object
is it object i was
initialized with?
is it object i was
initialized with?
C++11 value categories
rvalue ссылки продлевают жизнь
!
C++11 value categories
rvalue ссылки продлевают жизнь
!
int main() {
test{};
std::cout<<"hello"<<std::endl;
}
C++11 value categories
rvalue ссылки продлевают жизнь
!
int main() {
test{};
std::cout<<"hello"<<std::endl;
}
Constructo
r
Destructor
hello
C++11 value categories
rvalue ссылки продлевают жизнь
!
int main() {
test&& r_ref = test{};
std::cout<<"hello"<<std::endl;
}
C++11 value categories
rvalue ссылки продлевают жизнь
!
int main() {
test&& r_ref = test{};
std::cout<<"hello"<<std::endl;
}
Constructo
r
hello
Destructor
C++11 value categories
rvalue ссылки продлевают жизнь
!
int main() {
test&& r_ref = test{};
std::cout<<"hello"<<std::endl;
}
Constructo
r
hello
Destructor
C++11 Проблема копирования
#define BigNumber 100000
class BigClass{
int* bigArray = new int[BigNumber];
public:
BigClass(){
std::cout<<"Constructor"<<std::endl;
}
~BigClass(){
delete[] bigArray;
std::cout<<"Destructor"<<std::endl;
}
BigClass(const BigClass& other){
std::cout<<"Copy constructor"<<std::endl;
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
}
BigClass& operator=(const BigClass& other){
std::cout<<"Assignment"<<std::endl;
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
};
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
Интересно посмотреть:
RVO,NRVO,Copy elision
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
Интересно посмотреть:
RVO,NRVO,Copy elision
C++11 Проблема копирования
де-то в памяти*
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
Интересно посмотреть:
RVO,NRVO,Copy elision
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
Same
Data
Same
Data
C++11 Проблема копирования
Решение
BigClass& operator=(BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
C++11 Проблема копирования
Решение
BigClass& operator=(BigClass& other){
delete[] bigArray;
bigArray =other.bigArray;
other.bigArray = nullptr;
return *this;
}
BigClass& operator=(BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
bi
g
Dies
soon
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
bi
g
Dies
soon
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
bi
g
Dies
soon
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
bi
g
Dies
soon
C++11 Проблема копирования
BigClass make_BigClass(){
return BigClass{};
}
int main() {
BigClass big;
big = make_BigClass();
}
Constructor
Constructor
Assignment
Destructor
Destructor
де-то в памяти*
Интересно посмотреть:
RVO,NRVO,Copy elision
bi
g
Dies
soon
C++11 Проблема копирования
Решение
BigClass& operator=(BigClass& other){
delete[] bigArray;
bigArray =other.bigArray;
other.bigArray = nullptr;
return *this;
}
BigClass& operator=(BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
C++11 Проблема копирования
Решение (почти)
BigClass& operator=(BigClass& other){
delete[] bigArray;
bigArray =other.bigArray;
other.bigArray = nullptr;
return *this;
}
BigClass& operator=(BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
int main() {
BigClass big1;
BigClass big2;
big1 = big2;
}
C++11 Проблема копирования
Решение!
BigClass& operator=(const BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
BigClass& operator=(???){
delete[] bigArray;
bigArray =other.bigArray;
other.bigArray = nullptr;
return *this;
}
C++11 Проблема копирования
Решение!
BigClass& operator=(const BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
BigClass& operator=(BigClass&& other){
delete[] bigArray;
bigArray =other.bigArray;
other.bigArray = nullptr;
return *this;
}
C++11 Проблема копирования
Решение!
BigClass& operator=(const BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
BigClass& operator=(BigClass&& other){
if(this == &other)
return *this;
delete[] bigArray;
bigArray =other.bigArray;
other.bigArray = nullptr;
return *this;
}
C++11 Проблема копирования
Решение!
BigClass& operator=(const BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
return *this;
}
BigClass& operator=(BigClass&& other){
if(this == &other)
return *this;
delete[] bigArray;
bigArray =other.bigArray;
other.bigArray = nullptr;
return *this;
}
BigClass(const BigClass& other){
for(int i=0;i<BigNumber;i++){
bigArray[i] = other.bigArray[i];
}
}
BigClass(BigClass&& other){
delete[] bigArray;
bigArray = other.bigArray;
other.bigArray = nullptr;
}